/*#########################################
# Copyright (c) [2010-2011], Josef Robert Novak
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#  modification, are permitted #provided that the following conditions
#  are met:
#
# * Redistributions of source code must retain the above copyright 
#    notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above 
#    copyright notice, this list of #conditions and the following 
#    disclaimer in the documentation and/or other materials provided 
#    with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
# OF THE POSSIBILITY OF SUCH DAMAGE.
#########################################*/
#ifndef HTK2WFST_INC
#define HTK2WFST_INC
#include <tr1/unordered_map>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include "htkparser/htkparse.h"
#include "SymbolTable.h"
using namespace std;

typedef std::tr1::unordered_map<int, float> StateMap;

class HTK2WFST {
    
public:
    //Output file descriptors
    ofstream states_ofp;
    ofstream means_ofp;
    ofstream vars_ofp;
    ofstream pdfs_ofp;
    ofstream durs_ofp;
    ofstream hmms_ofp;
    ofstream carcs_ofp;
    ofstream harcs_ofp;
    //Output symbol tables
    SymbolTable hmm_syms;
    SymbolTable mean_syms;
    SymbolTable var_syms;
    SymbolTable state_syms;
    
    const char* prefix;
    int tot_states;
    StateMap htk_states;
    
    HTK2WFST( const char* prefix ) ;
    
    void parse_hmmdefs( const char *hmmdefs, const char* prefix_="test" ) ;
        
    vector<string> split( const string& s, const string& delim, const bool keep_empty=true );
    
    ~HTK2WFST( );
    
private:
    void output_wfst_am( ) ;
    void parse_gmm( HTKHMMState *st ) ;
    void output_durations( HTKHMMState *st );
    void output_carc( HTKHMMState *st );
    void output_means( const char *sh_name , int i, float *means );
    void output_vars(  const char *sh_name , int i, float *vars );
    int  find_tmat(    const char *sh_name );
};
#endif


